const errorType = require("../constans/error-types");
const { logger } = require("../../logger");
const Config = require("../model/config.model");
const Questionnaire = require("../model/questionnaire.model");
const { Op } = require("sequelize");

class ConfigController {
  async create(ctx, next) {
    const { name } = ctx.request.body;
    if (!name) {
      const error = new Error(errorType.NOPARAMETER);
      return ctx.app.emit("error", error, ctx);
    }
    await Config.create({
      name,
    })
      .then((res) => {
        ctx.success(res);
      })
      .catch((err) => {
        ctx.fail();
        logger.error(err);
      });
  }

  async detail(ctx, next) {
    const { configId } = ctx.params;
    if (!configId) {
      const error = new Error(errorType.NOPARAMETER);
      return ctx.app.emit("error", error, ctx);
    }
    await Config.findOne({
      where: { id: configId },
      include: {
        model: Questionnaire,
      },
    })
      .then((res) => {
        ctx.success(res);
      })
      .catch((err) => {
        ctx.fail(99);
        logger.error(err);
      });
  }

  async list(ctx, next) {
    const { limit, offset, keyword } = ctx.query;
    if (!limit || !offset) {
      const error = new Error(errorType.NOPARAMETER);
      return ctx.app.emit("error", error, ctx);
    }
    await Config.findAndCountAll({
      where: {
        name: {
          [Op.like]: `%${keyword}%`,
        },
      },
      include: {
        model: Questionnaire,
      },
      distinct: true,
      limit: parseInt(limit),
      offset: parseInt(limit) * parseInt(offset - 1),
    })
      .then((res) => {
        ctx.success({
          list: res.rows,
          total: res.count,
          limit,
          offset,
        });
      })
      .catch((err) => {
        ctx.fail();
        logger.error(err);
      });
  }

  async update(ctx, next) {
    const { name, id } = ctx.request.body;
    await Config.update(
      { name },
      {
        where: {
          id,
        },
      }
    )
      .then((res) => {
        res[0] ? ctx.success() : ctx.fail();
      })
      .catch((err) => {
        ctx.fail();
        logger.error(err);
      });
  }

  async remove(ctx, next) {
    const { configId } = ctx.params;
    await Config.destroy({
      where: {
        id: configId,
      },
    })
      .then((res) => {
        // 这样判断好像不太合理
        res ? ctx.success() : ctx.fail("");
      })
      .catch((err) => {
        ctx.fail();
        logger.error(err);
      });
  }
}

module.exports = new ConfigController();
